home *** CD-ROM | disk | FTP | other *** search
/ World of Amiga / World of Amiga.iso / archive / compression / lister12.lha / Lister.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-02  |  4.1 KB  |  186 lines

  1. /*
  2.   Lister Source Code - Released August 9th, 1991
  3.   Copyright 1991 Baf! Technologies
  4.   Written by Kerry Cianos and Geoffrey Faivre-Malloy
  5.   E-mail at : ktc0440c@apsu.bitnet or jjm7609c@apsu.bitnet
  6. */
  7.  
  8. /* include our source code */
  9.  
  10. #include "lister.h"
  11. #include "Output.c"
  12. #include "ListArc.c"
  13. #include "ListArj.c"
  14. #include "ListCpio.c"
  15. #include "ListLharc.c"
  16. #include "ListSit.c"
  17. #include "ListTar.c"
  18. #include "ListZip.c"
  19. #include "ListZoo.c"
  20.  
  21. char *vers = "$VER: Lister 1.25" ;
  22.  
  23. main (int argc, char *argv[])
  24. {
  25.   ULONG i;
  26.   BOOL ok;
  27.   int x,count;
  28.   myfunc_p fn[NUMTYPES];
  29.  
  30.   fn[0] = ListArc;
  31.   fn[1] = ListArj;
  32.   fn[2] = ListCpio;
  33.   fn[3] = ListLharc;
  34.   fn[4] = ListLharc;
  35.   fn[5] = ListSit;
  36.   fn[6] = ListTar;
  37.   fn[7] = ListZip;
  38.   fn[8] = ListZoo;
  39.  
  40.   if (argc >= 2)
  41.    {
  42.      for (count=1; count < argc;count++)
  43.       {
  44.         i = Detect(argv[count]);
  45.         if ((i & ADD_EXT) || (i & SAME))
  46.          for (x=0; x < NUMTYPES; x++)
  47.           {
  48.             if (i & ADD_EXT)
  49.              {
  50.              if (i & pow2(x)) CheckError(fn[x](x|ADD_EXT,argv[count]));
  51.              }
  52.             else if (i & pow2(x)) CheckError(fn[x](x|SAME,argv[count]));
  53.            }
  54.         else if (i & NOTFOUND)
  55.          {
  56.            for(i=0; i < NUMTYPES; i++)
  57.             {
  58.              ok = fn[i](i|SAME,argv[count]);
  59.              if (ok == TRUE) break;
  60.             }
  61.           if (ok == WRONG_ARCHIVE) CheckError(UNKNOWN);
  62.          }
  63.       }
  64.    }
  65.   else Usage(argv[0]);
  66.   return(0);
  67. }
  68.  
  69. void Usage(char *name)
  70. {
  71.   printf("\nLister v1.25 -  Copyright 1992 Baf! Technologies\n");
  72.   printf("Email us at : ktc0440c@apsu.bitnet or gf7609c@apsu.bitnet\n\n");
  73.   printf("Usage : %s <filename>\n\n",name);
  74.   exit(0);
  75. }
  76.  
  77. /*  Converts from MS-DOG time and date to english format
  78.     and places the string into the global time_str */
  79. BOOL MSDog(int time, int date, UBYTE *time_str)
  80. {
  81.   unsigned int yr, mo, day, hr, min, sec;
  82.  
  83.   yr = (date >> 9 & 0x7f) + 1980;
  84.   mo = date >> 5 & 0x0f;
  85.   day = date & 0x1f;
  86.   hr = time >> 11 & 0x1f;
  87.   min = time >> 5 & 0x3f;
  88.   sec = (time & 0x1f) * 2;
  89.  
  90. #ifdef CHECKDATE
  91.   if ( (mo < 1) || (mo > 12) || (day < 1) || (day > 31) || (hr < 0) ||
  92.     (hr > 23) || (min < 0) || (min > 59) || (sec < 0) || (sec > 59) ) {
  93.     Error("Corrupted archive!");
  94.     return abort;
  95.     }
  96. #endif
  97.  
  98.   sprintf(time_str, "%2d-%s-%d %02d:%02d:%02d", day, months[mo-1], yr, hr,
  99.     min, sec);
  100.   return OK;
  101. }
  102.  
  103. /* This will return an unsigned long integer calculated from the global */
  104. /* buffer used for storage.  Pass the high byte to this routine.        */
  105.  
  106. ULONG GetLong (UBYTE *b,int temp)
  107. {
  108.   return ((ULONG) (b[temp] << 24) + (ULONG) (b[temp-1] << 16) +
  109.           (ULONG) (b[temp-2] << 8) + (ULONG) b[temp-3]);
  110. }
  111.  
  112. /* Open the input file */
  113. FILE *OpenFile(ULONG type,UBYTE *infile)
  114. {
  115.   UBYTE filename[256];
  116.   FILE *fp;
  117.  
  118.   if ((type & (SAME | ADD_EXT)) == SAME)
  119.     sprintf(filename,"%s",infile);
  120.   else sprintf(filename,"%s%s",infile,filetype[type-ADD_EXT]);
  121.   fp = fopen(filename,"rb");
  122.   if (fp == NULL) CheckError(FILE_ERROR);
  123.    else return fp;
  124. }
  125.  
  126. /* Read x bytes from infile - Do error checking here too */
  127.  
  128. int
  129. ReadBuf(int x,FILE *fp,UBYTE *b)
  130. {
  131.   int count;
  132.   count = fread(b,x,1,fp);
  133.   if (count == 0)
  134.     { fclose (fp); CheckError(FILE_ERROR); }
  135.   else return (count);
  136. }
  137.  
  138. /* routine to convert octal stored ascii into numerical form */
  139. int
  140. Convert8(char *str)
  141. {
  142.   int x;
  143.  
  144.   x = (str[5] - 48) + (str[4] - 48) * 8 + (str[3] - 48) * 64 +
  145.       (str[2] - 48) * 512 + (str[1] - 48) * 4096 + (str[0] - 48) * 32768;
  146.   return (x);
  147. }
  148.  
  149. ULONG Detect(UBYTE *infile)
  150. {
  151.   int i;
  152.   ULONG type = NOTFOUND;
  153.  
  154.   for (i = 0; i < NUMTYPES; i++)
  155.     if (strstr(infile,filetype[i]) != NULL)
  156.       return SAME | pow2(i);
  157.   for (i = 0; i < NUMTYPES; i++)
  158.     if (CheckFile(filetype[i],infile))
  159.       type |= ADD_EXT | pow2(i);
  160.   if (type == NOTFOUND && !CheckFile("",infile)) CheckError(NOTFOUND);
  161.   return type;
  162. }
  163.  
  164. BOOL
  165. CheckFile(char *ext,UBYTE *infile)
  166. {
  167.   char temp[132];
  168.   FILE *fp;
  169.  
  170.   sprintf(temp,"%s%s",infile,ext);
  171.   if ((fp = fopen (temp,"r")) != NULL)
  172.    {
  173.     fclose(fp);
  174.     return TRUE;
  175.    }
  176.   else return FALSE;
  177. }
  178.  
  179. ULONG pow2(int i)
  180. {
  181.   ULONG x = 1;
  182.   for (;i != 0; i--)
  183.    x *= 2;
  184.   return x;
  185. }
  186.